﻿using System;
using System.Linq;
using System.Collections;
using System.Collections.Generic;

namespace LightEngine
{
    namespace MessbauerCore
    {
        namespace MessbauerData
        {
            /// <описание класса public class ActionMemento>
            /// Версия класса 1.0
            /// Автор(ы): Ушаков Михаил
            /// Класс предназначен для хранения истории результатов преобразования Мессбауэровских спектров
            /// и извлечения любого элемента истории (спектра).
            /// Элементы класса:
            /// 1. Константы класса:
            ///    отсутствуют.
            /// 2. Поля класса:
            /// а) List<MessbSpectrum> AppActionsMemory контейнер истории преобразований.
            /// б) Int16 StepIndex активный индекс - указывает на то какой элемент AppActionsMemory 
            ///    используется в данный момент, если равен -1 то в данный момент ActionMemento не 
            ///    используется либо только что была удалена история полностью.
            /// 3. Методы класса:
            /// а) public ActionMemento() конструктор класса, инициализация полей начальными значениями
            /// б) public Boolean CanStepBack() проверка возможности переместиться на 1 шаг назад по 
            ///    истории без изменения индекса StepIndex, если возможно возращает  true, иначе false.
            /// в) public Boolean StepBack() перемещение на 1 шаг назад по истории, декремент StepIndex
            ///    (если такое возможно), возвращает true если StepIndex удалось уменьшить на 1, иначе false.
            /// г) public Boolean CanStepForward() проверка возможности переместиться на 1 шаг вперед по 
            ///    истории без изменения индекса StepIndex, если возможно возращает  true, иначе false.
            /// д) public Boolean StepForward() перемещение на 1 шаг вперед по истории, инкремент StepIndex
            ///    (если такое возможно), возвращает true если StepIndex удалось увеличить на 1, иначе false.
            /// е) public void RememberState(MessbSpectrum CurrentSpectrum) сохранении Мессбауэровского 
            ///    спектра, задаваемого в аргументе CurrentSpectrum в AppActionsMemory, если история пуста
            ///    т.е. StepIndex равен -1, StepIndex получает значение равное 0 (первый элемент в списке 
            ///    истории преобразований).
            /// ж) public void TruncateRemembedSpecs() выполнение очистки списка истории преобразований,
            ///    StepIndex сбрасывается в -1.
            /// 4. Свойства и индексаторы класса:
            /// а) public Boolean HasMementoRecords свойство только для чтения, возвращает true если в
            ///    списке истории преобразований мессбауэровских спектров есть записи.
            /// б) public MessbSpectrum PointedMessbSpectrum свойство только для чтения возвращает 
            ///    AppActionsMemory[StepIndex] если StepIndex лежит в допустимы пределах [0, Lenght-1]
            ///    иначе возвращает null.
            /// </описание класса public class ActionMemento>
            public class ActionMemento
            {
                List<MessbSpectrum> AppActionsMemory = new List<MessbSpectrum>();
                Int16 StepIndex = -1;

                public ActionMemento()
                {
                }

                public Boolean CanStepBack()
                {
                    if (StepIndex - 1 >= 0)
                    {
                        return true;
                    }
                    return false;
                }

                public Boolean StepBack()
                {
                    if (CanStepBack() == true)
                    {
                        StepIndex--;
                        return true;
                    }
                    return false;
                }

                public Boolean CanStepForward()
                {
                    if (StepIndex + 1 <= AppActionsMemory.Count - 1)
                    {
                        return true;
                    }
                    return false;
                }

                public Boolean StepForward()
                {
                    if (CanStepForward() == true)
                    {
                        StepIndex++;
                        return true;
                    }
                    return false;
                }

                public void RememberState(MessbSpectrum CurrentSpectrum)
                {
                    AppActionsMemory.Add(CurrentSpectrum);
                    if (StepIndex == -1)
                    {
                        StepIndex = 0;
                        return;
                    }
                    StepIndex++;
                }

                public Boolean HasMementoRecords
                {
                    get
                    {
                        if (AppActionsMemory.Count > 0)
                            return true;
                        else return false;
                    }
                }

                public void TruncateRemembedSpecs()
                {
                    AppActionsMemory.RemoveAll(Item => Item != null);
                    StepIndex = -1;
                }

                public MessbSpectrum PointedMessbSpectrum
                {
                    get
                    {
                        if (StepIndex >= 0 && StepIndex <= AppActionsMemory.Count - 1)
                        {
                            return AppActionsMemory[StepIndex];
                        }
                        return null;
                    }
                }
            }
        }
    }
}
